﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using LibraryMusicStore;
using MvcMusicStore.Infrastructure.Extensions;
using MvcMusicStore.Infrastructure.Untils;

namespace MvcMusicStore.Models
{
    #region old
    //#region Models
    //[PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "Mật khẩu mới và mật khẩu xác nhận không phù hợp.")]
    //public class ChangePasswordModel
    //{
    //    [Required(ErrorMessage="Nhập mật khẩu")]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Mật khẩu cũ")]
    //    public string OldPassword { get; set; }

    //    [Required(ErrorMessage = "Nhập mật khẩu mới")]
    //    [ValidatePasswordLength]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Mật khẩu mới")]
    //    public string NewPassword { get; set; }

    //    [Required(ErrorMessage = "Nhập mật khẩu xác nhận")]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Xác nhận mật khẩu")]
    //    public string ConfirmPassword { get; set; }
    //}

    //public class LogOnModel
    //{
    //    [Required(ErrorMessage="Nhập tài khoản")]
    //    [DisplayName("Tài khoản")]
    //    public string UserName { get; set; }

    //    [Required(ErrorMessage = "Nhập mật khẩu")]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Mật khẩu")]
    //    public string Password { get; set; }

    //    [DisplayName("Ghi nhớ?")]
    //    public bool RememberMe { get; set; }
    //}

    //[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "Mật khẩu và mật khẩu xác nhận không phù hợp.")]
    //public class RegisterModel
    //{
    //    [Required(ErrorMessage="Nhập tài khoản")]
    //    [DisplayName("Tài khoản")]
    //    public string UserName { get; set; }

    //    [Required(ErrorMessage = "Nhập email")]
    //    [DataType(DataType.EmailAddress)]
    //    [DisplayName("Email")]
    //    public string Email { get; set; }

    //    [Required(ErrorMessage = "Nhập mật khẩu")]
    //    [ValidatePasswordLength]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Mật khẩu")]
    //    public string Password { get; set; }

    //    [Required(ErrorMessage = "Nhập mật khẩu xác nhận")]
    //    [DataType(DataType.Password)]
    //    [DisplayName("Xác nhận mật khẩu")]
    //    public string ConfirmPassword { get; set; }
    //}
    //#endregion

    //#region Services
    //// The FormsAuthentication type is sealed and contains static members, so it is difficult to
    //// unit test code that calls its members. The interface and helper class below demonstrate
    //// how to create an abstract wrapper around such a type in order to make the AccountController
    //// code unit testable.

    //public interface IMembershipService
    //{
    //    int MinPasswordLength { get; }

    //    bool ValidateUser(string userName, string password);
    //    MembershipCreateStatus CreateUser(string userName, string password, string email);
    //    bool ChangePassword(string userName, string oldPassword, string newPassword);
    //}

    //public class AccountMembershipService : IMembershipService
    //{
    //    private readonly MembershipProvider _provider;

    //    public AccountMembershipService()
    //        : this(null)
    //    {
    //    }

    //    public AccountMembershipService(MembershipProvider provider)
    //    {
    //        _provider = provider ?? Membership.Provider;
    //    }

    //    public int MinPasswordLength
    //    {
    //        get
    //        {
    //            //return _provider.MinRequiredPasswordLength;
    //            return 6;
    //        }
    //    }

    //    public bool ValidateUser(string userName, string password)
    //    {
    //        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
    //        if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");

    //        return _provider.ValidateUser(userName, password);
    //    }

    //    public MembershipCreateStatus CreateUser(string userName, string password, string email)
    //    {
    //        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
    //        if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");
    //        if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "email");

    //        MembershipCreateStatus status;
    //        _provider.CreateUser(userName, password, email, null, null, true, null, out status);
    //        return status;
    //    }

    //    public bool ChangePassword(string userName, string oldPassword, string newPassword)
    //    {
    //        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
    //        if (String.IsNullOrEmpty(oldPassword)) throw new ArgumentException("Value cannot be null or empty.", "oldPassword");
    //        if (String.IsNullOrEmpty(newPassword)) throw new ArgumentException("Value cannot be null or empty.", "newPassword");

    //        // The underlying ChangePassword() will throw an exception rather
    //        // than return false in certain failure scenarios.
    //        try
    //        {
    //            MembershipUser currentUser = _provider.GetUser(userName, true /* userIsOnline */);
    //            return currentUser.ChangePassword(oldPassword, newPassword);
    //        }
    //        catch (ArgumentException)
    //        {
    //            return false;
    //        }
    //        catch (MembershipPasswordException)
    //        {
    //            return false;
    //        }
    //    }
    //}

    //public interface IFormsAuthenticationService
    //{
    //    void SignIn(string userName, bool createPersistentCookie);
    //    void SignOut();
    //}

    //public class FormsAuthenticationService : IFormsAuthenticationService
    //{
    //    public void SignIn(string userName, bool createPersistentCookie)
    //    {
    //        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");

    //        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    //    }

    //    public void SignOut()
    //    {
    //        FormsAuthentication.SignOut();
    //    }
    //}
    //#endregion

    //#region Validation
    //public static class AccountValidation
    //{
    //    public static string ErrorCodeToString(MembershipCreateStatus createStatus)
    //    {
    //        // See http://go.microsoft.com/fwlink/?LinkID=177550 for
    //        // a full list of status codes.
    //        switch (createStatus)
    //        {
    //            case MembershipCreateStatus.DuplicateUserName:
    //                return "Tài khoản đã tồn tại. Vui lòng chọn tài khoản khác.";

    //            case MembershipCreateStatus.DuplicateEmail:
    //                return "Tài khoản cho e-mail đã tồn tại. Vui lòng chọn email khác.";

    //            case MembershipCreateStatus.InvalidPassword:
    //                return "Mật khẩu không hợp lệ.";

    //            case MembershipCreateStatus.InvalidEmail:
    //                return "Email không hợp lệ.";

    //            case MembershipCreateStatus.InvalidAnswer:
    //                return "Câu trả lời hồi mật khẩu không hợp lệ.";

    //            case MembershipCreateStatus.InvalidQuestion:
    //                return "Câu hỏi hồi mật khẩu không hợp lệ.";

    //            case MembershipCreateStatus.InvalidUserName:
    //                return "Tài khoản không hợp lệ";

    //            case MembershipCreateStatus.ProviderError:
    //                return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

    //            case MembershipCreateStatus.UserRejected:
    //                return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

    //            default:
    //                return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
    //        }
    //    }
    //}

    //[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    //public sealed class PropertiesMustMatchAttribute : ValidationAttribute
    //{
    //    private const string _defaultErrorMessage = "'{0}' và '{1}' không phù hợp.";
    //    private readonly object _typeId = new object();

    //    public PropertiesMustMatchAttribute(string originalProperty, string confirmProperty)
    //        : base(_defaultErrorMessage)
    //    {
    //        OriginalProperty = originalProperty;
    //        ConfirmProperty = confirmProperty;
    //    }

    //    public string ConfirmProperty { get; private set; }
    //    public string OriginalProperty { get; private set; }

    //    public override object TypeId
    //    {
    //        get
    //        {
    //            return _typeId;
    //        }
    //    }

    //    public override string FormatErrorMessage(string name)
    //    {
    //        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
    //            OriginalProperty, ConfirmProperty);
    //    }

    //    public override bool IsValid(object value)
    //    {
    //        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
    //        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
    //        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
    //        return Object.Equals(originalValue, confirmValue);
    //    }
    //}

    //[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    //public sealed class ValidatePasswordLengthAttribute : ValidationAttribute
    //{
    //    private const string _defaultErrorMessage = "'{0}' phải có ít nhất {1} kí tự.";
    //    private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength;

    //    public ValidatePasswordLengthAttribute()
    //        : base(_defaultErrorMessage)
    //    {
    //    }

    //    public override string FormatErrorMessage(string name)
    //    {
    //        return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
    //            name, _minCharacters);
    //    }

    //    public override bool IsValid(object value)
    //    {
    //        string valueAsString = value as string;
    //        return (valueAsString != null && valueAsString.Length >= _minCharacters);
    //    }
    //}
    //#endregion
    #endregion

    public class LogOnModel
    {
        [DisplayName("Tài khoản")]
        [Required(ErrorMessage = "Nhập tài khoản")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string username { get; set; }

        [DisplayName("Mật khẩu")]
        
        [Required(ErrorMessage = "Nhập mật khẩu")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DataType(DataType.Password)]
        public string password { get; set; }

        [HiddenInput(DisplayValue = false)]
        public string ReturnUrl { get; set; }

        [DisplayName("Ghi nhớ")]
        [ScaffoldColumn(false)]
        public bool RememberMe { get; set; }
    }

    [PropertiesMustMatch("password", "ConfirmPassword", ErrorMessage = "Mật khẩu và mật khẩu xác nhận không hợp")]
    public class RegisterModel
    {
        public static int MinPasswordLength
        {
            get { return 6; }
        }

        [DisplayName("Tài khoản")]
        [Required(ErrorMessage = "Nhập tài khoản")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string username { get; set; }

        [DisplayName("Mật khẩu")]
        [Required(ErrorMessage = "Nhập mật khẩu")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DataType(DataType.Password)]
        public string password { get; set; }

        [DisplayName("Xác nhận mật khẩu")]
        [Required(ErrorMessage = "Nhập mật khẩu xác nhận")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DataType(DataType.Password)]
        public string ConfirmPassword { get; set; }

        [DisplayName("Họ tên")]
        public string fullname { get; set; }

        [DisplayName("Email")]
        [Required(ErrorMessage = "Nhập email")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [RegularExpression(PresentationUtils.EmailPattern, ErrorMessage = "Sai định dạng")]
        public string email { get; set; }

        [DisplayName("Địa chỉ")]
        public string address { get; set; }

        [DisplayName("Thành phố")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string city { get; set; }

        [DisplayName("Quốc gia")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string country { get; set; }

        [DisplayName("Điện thoại")]
        [StringLength(20, ErrorMessage = "20 kí tự")]
        public string phone { get; set; }

        //[StringLength(64, ErrorMessage = "Website cannot be longer than 64 characters")]
        //[RegularExpression(PresentationUtils.UrlPattern, ErrorMessage = "Invalid website URL")]
        //public string Website { get; set; }
    }

    [PropertiesMustMatch("NewPassword", "ConfirmPassword", ErrorMessage = "Mật khẩu mới và mật khẩu xác nhận không phù hợp.")]
    public class ChangePasswordModel
    {
        [Required(ErrorMessage = "Nhập mật khẩu hiện tại")]
        [DataType(DataType.Password)]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DisplayName("Mật khẩu cũ")]
        public string OldPassword { get; set; }

        [Required(ErrorMessage = "Nhập mật khẩu mới")]
        
        [DataType(DataType.Password)]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DisplayName("Mật khẩu mới")]
        public string NewPassword { get; set; }

        [Required(ErrorMessage = "Nhập mật khẩu xác nhận")]
        [DataType(DataType.Password)]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        [DisplayName("Xác nhận mật khẩu")]
        public string ConfirmPassword { get; set; }
    }

    public class ChangeInfomationModel
    {
        [ScaffoldColumn(false)]
        public int userid { get; set; }

        [ScaffoldColumn(false)]
        public int roleid { get; set; }

        [ScaffoldColumn(false)]
        public string username { get; set; }

        [ScaffoldColumn(false)]
        [DataType(DataType.Password)]
        public string password { get; set; }

        [DisplayName("Họ tên")]
        public string fullname { get; set; }

        [DisplayName("Email")]
        [Required(ErrorMessage = "Nhập email")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        //[RegularExpression(PresentationUtils.EmailPattern, ErrorMessage = "Sai định dạng")]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",
                ErrorMessage = "Email không hợp lệ.")]
        [DataType(DataType.EmailAddress)]
        public string email { get; set; }

        [DisplayName("Địa chỉ")]
        public string address { get; set; }

        [DisplayName("Thành phố")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string city { get; set; }

        [DisplayName("Quốc gia")]
        [StringLength(50, ErrorMessage = "50 kí tự")]
        public string country { get; set; }

        [DisplayName("Điện thoại")]
        [StringLength(20, ErrorMessage = "20 kí tự")]
        public string phone { get; set; }
    }
}
